﻿// /src/composables/useWangUpload.js
import { ref } from "vue";
import { commonUpload } from "@/api/model/files.js";

/**
 * 给 wangEditor 用的统一上传封装
 * @param {Object} options
 *  - imgMaxMB   图片大小上限（MB）
 *  - fileMaxMB  附件大小上限（MB）
 *  - videoMaxMB 视频大小上限（MB）
 *  - isSecretFile 是否私密（后端如果需要）
 *  - extraParams  额外 query 参数（对象），会拼到每次上传请求里
 */
export default function useWangUpload(options = {}) {
  const cfg = Object.assign(
    {
      imgMaxMB: 10,
      fileMaxMB: 20,
      videoMaxMB: 100,
      isSecretFile: false,
      extraParams: {},
    },
    options || {}
  );

  const MB = 1024 * 1024;

  // 进度 & loading（给外部 <el-progress> 用）
  const uploading = ref(false);
  const progress = ref(0);

  // 统一从各种返回结构里抠出 URL
  function pickUrl(res) {
    // axios 场景：res 已经是响应体；也兼容 res.data 才是真实数据
    const d = res && res.data !== undefined ? res.data : res;

    // 1) 直接就是字符串
    if (typeof d === "string") return d;

    // 2) data 还是字符串
    if (typeof d?.data === "string") return d.data;

    // 3) 常见包裹字段
    return d?.data?.url || d?.data?.path || d?.data?.fullUrl || d?.url || d?.path || "";
  }

  // 统一发请求 + 解析返回 url
  async function doUpload(fileType, file) {
    // 大小校验
    const maxMB = fileType === "01" ? cfg.imgMaxMB : fileType === "02" ? cfg.fileMaxMB : cfg.videoMaxMB;
    if (file.size > maxMB * MB) {
      throw new Error(`文件不能超过 ${maxMB}MB`);
    }

    const form = new FormData();
    form.append("file", file);

    // 可选 query（按你们接口文档需要传什么就传什么）
    const params = {
      fileType, // 01=图片 02=文件 03=视频
      isSecretFile: cfg.isSecretFile,
      limitSize: Math.round(maxMB * 1024), // 如果后端需要以 KB 传
      ...cfg.extraParams,
    };

    uploading.value = true;
    progress.value = 0;
    try {
      // 注意：commonUpload 需要支持 (form, params, onProgress)
      // onProgress 接收 0~100 的数字
      const res = await commonUpload(form, params, p => (progress.value = p));
      const url = pickUrl(res);
      if (!url) throw new Error("上传成功但未拿到文件 URL");
      return url;
    } finally {
      uploading.value = false;
      progress.value = 0;
    }
  }

  // === 供 editor 使用的菜单配置 ===
  const menuConf = {
    // 图片
    uploadImage: {
      // 也可限制类型：allowedFileTypes: ['image/png','image/jpeg']
      onProgress: p => (progress.value = p), // 双保险
      customUpload: async (file, insertFn) => {
        try {
          const url = await doUpload("01", file);
          // insertFn(src, alt, href)
          insertFn(url, file?.name || "", url);
        } catch (e) {
          // console.error("uploadImage-error", e);
          $msg.error(e?.message || "图片上传失败");
        }
      },
    },

    // 视频
    uploadVideo: {
      onProgress: p => (progress.value = p),
      customUpload: async (file, insertFn) => {
        try {
          const url = await doUpload("03", file);
          // insertFn(url[, poster])
          insertFn(url);
        } catch (e) {
          // console.error("uploadVideo-error", e);
          $msg.error(e?.message || "视频上传失败");
        }
      },
    },

    // 附件（需安装 upload-attachment 插件）
    uploadAttachment: {
      onProgress: p => (progress.value = p),
      customUpload: async (file, insertFn) => {
        try {
          const url = await doUpload("02", file);
          // insertFn(url, fileName)
          insertFn(url, file?.name || "");
        } catch (e) {
          // console.error("uploadAttachment-error", e);
          $msg.error(e?.message || "附件上传失败");
        }
      },
    },
  };

  // 把 uploading、progress 暴露给页面去画 el-progress
  return { menuConf, uploading, progress };
}
